// 观察者模式：建立观察者/被观察者关系，观察者可以注册其观察对象(被观察者)，当被观察者的状态发生改变时，可以及时通知到观察者

// 被观察者管理观察者能力建模
function ObserverList() {
    this.observerList = [];
}

// 添加观察者
ObserverList.prototype.Add = function(observer) {
    this.observerList.push(observer);
}

// 清空观察者
ObserverList.prototype.Empty = function() {
    this.observerList = [];
}

// 观察者数量
ObserverList.prototype.Count = function() {
    return this.observerList.length;
}

// 获取某个观察者
ObserverList.prototype.Get = function(index) {
    if (index >= 0 && index < this.observerList.length) {
        return this.observerList[index];
    }
    return undefined;
}

// 删除某个观察者
ObserverList.prototype.RemoveAt = function( index ){
    if( index === 0 ){
      this.observerList.shift();
    }else if( index === this.observerList.length -1 ){
      this.observerList.pop();
    }
};

// var testObserverList = new ObserverList();
// for(var key in testObserverList) {
//     console.log('key:' + key + '->' + testObserverList[key]);
// }

// 给某个对象扩展被观察者能力
function extend(extension, target) {
    for(var key in extension) {
        target[key] = extension[key];
    }
}

// 创建被观察者对象Subject,同时集成观察者对象的能力
function Subject() {
    this.observerList = new ObserverList();
};

Subject.prototype.AddObserver = function(observer) {
    this.observerList.Add(observer)
};

Subject.prototype.RemoveObserver = function( observer ){
    this.observers.RemoveAt( this.observers.IndexOf( observer, 0 ) );
}; 

// 通知所有观察者
Subject.prototype.Notify = function(context) {
    var count = this.observerList.Count();
    for(var i = 0; i < count; i++) {
        this.observerList.Get(i).Update(context);
    }
};


// 构建观察者对象，主要是定义观察后的处理函数
function Observer() {
    this.Update = function() {
        //do something
    }
}
